]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
objectManager: handle proxies coming and going
authorRay Strode <rstrode@redhat.com>
Fri, 7 Oct 2016 19:40:14 +0000 (15:40 -0400)
committerRay Strode <rstrode@redhat.com>
Thu, 5 Jan 2017 18:11:21 +0000 (13:11 -0500)
Ever since commit b8e29ae8c78658917c8a8ddd391667d7d9e36971
(I think), start up is littered with this message:

 Gjs-WARNING **: JS ERROR: could not get remote objects for service
 org.gnome.SettingsDaemon.Smartcard path

since gnome-shell is now started before gnome-settings-daemon.

This commit addresses the problem by making the object manager code
not try to autostart its proxy, and instead wait for it to appear.

https://bugzilla.gnome.org/show_bug.cgi?id=772589

js/misc/objectManager.js

index 225204347a444a4df314d69811e12b103e78dac4..c1f8341a92ab2017cca493c16b4dea6f540c3748 100644 (file)
@@ -46,7 +46,7 @@ const ObjectManager = new Lang.Class({
                                                  g_interface_info: ObjectManagerInfo,
                                                  g_name: this._serviceName,
                                                  g_object_path: this._managerPath,
-                                                 g_flags: Gio.DBusProxyFlags.NONE });
+                                                 g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 
         this._interfaceInfos = {};
         this._objects = {};
@@ -65,6 +65,9 @@ const ObjectManager = new Lang.Class({
     },
 
     _tryToCompleteLoad: function() {
+        if (this._numLoadInhibitors == 0)
+            return;
+
         this._numLoadInhibitors--;
         if (this._numLoadInhibitors == 0) {
             if (this._onLoaded)
@@ -86,7 +89,7 @@ const ObjectManager = new Lang.Class({
                                        g_object_path: objectPath,
                                        g_interface_name: interfaceName,
                                        g_interface_info: info,
-                                       g_flags: Gio.DBusProxyFlags.NONE });
+                                       g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 
         proxy.init_async(GLib.PRIORITY_DEFAULT,
                          this._cancellable,
@@ -181,6 +184,18 @@ const ObjectManager = new Lang.Class({
             return;
         }
 
+        this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
+            if (this._dbusProxy.g_name_owner)
+                this._onNameAppeared();
+            else
+                this._onNameVanished();
+        }));
+
+        if (this._dbusProxy.g_name_owner)
+            this._onNameAppeared();
+    },
+
+    _onNameAppeared: function() {
         this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
             if (!result) {
                 if (error) {
@@ -213,6 +228,21 @@ const ObjectManager = new Lang.Class({
         }));
     },
 
+    _onNameVanished: function() {
+        let objectPaths = Object.keys(this._objects);
+        for (let i = 0; i < objectPaths.length; i++) {
+            let object = this._objects[objectPaths];
+
+            let interfaceNames = Object.keys(object);
+            for (let j = 0; i < interfaceNames.length; i++) {
+                let interfaceName = interfaceNames[i];
+
+                if (object[interfaceName])
+                    this._removeInterface(objectPath, interfaceName);
+            }
+        }
+    },
+
     _registerInterfaces: function(interfaces) {
         for (let i = 0; i < interfaces.length; i++) {
             let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);